//给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
//
//
//
// 示例 1：
//
//
//输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
//输出：6
//解释：连续子数组 [4,-1,2,1] 的和最大，为 6 。
//
//
// 示例 2：
//
//
//输入：nums = [1]
//输出：1
//
//
// 示例 3：
//
//
//输入：nums = [0]
//输出：0
//
//
// 示例 4：
//
//
//输入：nums = [-1]
//输出：-1
//
//
// 示例 5：
//
//
//输入：nums = [-100000]
//输出：-100000
//
//
//
//
// 提示：
//
//
// 1 <= nums.length <= 10⁵
// -10⁴ <= nums[i] <= 10⁴
//
//
//
//
// 进阶：如果你已经实现复杂度为 O(n) 的解法，尝试使用更为精妙的 分治法 求解。
// Related Topics 数组 分治 动态规划 👍 3840 👎 0

package leetcode.editor.cn;

@SuppressWarnings("all")
//Java：最大子序和
public class 最大子序和 {
    public static void main(String[] args) {
        Solution solution = new 最大子序和().new Solution();
        System.out.println(solution.maxSubArray(new int[]{4, -1, 2, 1}));
        // TO TEST
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int maxSubArray(int[] nums) {
            if (nums.length == 1) {
                return nums[0];
            }
            int sum = Integer.MIN_VALUE;
            int count = 0;
            for (int i = 0; i < nums.length; i++) {
                count += nums[i];
                sum = Math.max(sum, count); // 取区间累计的最大值（相当于不断确定最大子序终止位置）
                if (count <= 0) {
                    count = 0; // 相当于重置最大子序起始位置，因为遇到负数一定是拉低总和
                }
            }
            return sum;
        }

        private int maxSum(int[] nums) {
            if (nums.length == 1)
                return nums[0];

            int sum = 0;
            int max = sum;
            for (int num : nums) {
                sum = sum < 0 ? num : sum + num;
                max = Math.max(sum, max);
            }
            return max;

        }
    }

//leetcode submit region end(Prohibit modification and deletion)


}
